<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <meta name="viewport" content="width=device-width">
        <link rel="shortcut icon" href="../favicon.ico">
        <script src="js/jquery.min.js"></script>
        <title>jsPlumb Community Edition Documentation</title>
        <link href="//fonts.googleapis.com/css?family=Lato:400,700" rel="stylesheet">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
<link href="css/main.css" rel="stylesheet">




        <link rel="stylesheet" href="css/docs.css">
        <script src="js/docs.js"></script>
    </head>

    <body class="jtk-bootstrap-wide">

        <div class="jtk-header">
    <a class="jtk-logo" href="/"><img src="logo-medium-jsplumb.png"></a>

</div>


        <div class="padding-top" style="margin-top:20px;display:flex;">

                <div id="docs-nav" tabindex="0">
                    <ul>
<li>Imports and Setup

<ul>
<li><a href="home.html#browser">Browser Compatibility</a></li>
<li><a href="home.html#setup">Setup</a></li>
<li><a href="home.html#doctype">Doctype</a></li>
<li><a href="home.html#imports">Required Imports</a></li>
<li><a href="home.html#initializing">Initializing jsPlumb</a></li>
<li><a href="home.html#multiple">Multiple jsPlumb Instances</a></li>
<li><a href="home.html#zindex">Z-Index Considerations</a></li>
<li><a href="home.html#container">Where does jsPlumb add elements?</a></li>
<li><a href="home.html#performance">Performance</a></li>
<li><a href="zooming.html">Zooming</a></li>
<li><a href="defaults.html">Configuring Defaults</a></li>
</ul></li>
<li>Concepts

<ul>
<li><a href="basic-concepts.html">Introduction</a></li>
<li><a href="anchors.html">Anchors</a></li>
<li><a href="connectors.html">Connectors</a></li>
<li><a href="endpoints.html">Endpoints</a></li>
<li><a href="overlays.html">Overlays</a></li>
<li><a href="groups.html">Groups</a></li>
<li><a href="lists.html">Scrollable Lists</a></li>
</ul></li>
<li>Nodes

<ul>
<li><a href="dragging.html">Element Dragging</a></li>
</ul></li>
<li>Connections

<ul>
<li><a href="connections.html">Overview</a></li>
<li><a href="connections.html#programmatic">Programmatic Connections</a></li>
<li><a href="connections.html#common">Reusing Common Settings</a></li>
<li><a href="connections.html#detaching">Detaching Programmatic Connections</a></li>
<li><a href="connections.html#draganddrop">Drag and Drop Connections</a></li>
<li><a href="connections.html#sourcesandtargets">Elements as sources &amp; targets</a></li>
<li><a href="connections.html#maketarget">Element Targets</a></li>
<li><a href="connections.html#makesource">Element Sources</a></li>
<li><a href="connections.html#sourcefilter">Specifying drag source area</a></li>
<li><a href="removing.html">Removing Connections/Endpoints</a></li>
<li><a href="parameters.html">Connection &amp; Endpoint Parameters</a></li>
</ul></li>
<li>Connection &amp; Endpoint Types

<ul>
<li><a href="types.html">Introduction</a></li>
<li><a href="types.html#connection-type">Connection Types</a></li>
<li><a href="types.html#endpoint-type">Endpoint Types</a></li>
</ul></li>
<li>Events

<ul>
<li><a href="events.html">Overview</a></li>
<li><a href="interceptors.html">Interceptors</a></li>
</ul></li>
<li>Appearance

<ul>
<li><a href="paint-styles.html">Styling via Paint Styles</a></li>
<li><a href="styling-via-css.html">Styling via CSS</a></li>
</ul></li>
<li>Querying jsPlumb

<ul>
<li><a href="querying.html#select">Selecting a list of Connections</a></li>
<li><a href="querying.html#selectEndpoints">Selecting a list of Endpoints</a></li>
</ul></li>
<li>Miscellaneous

<ul>
<li><a href="animation.html">Animation</a></li>
<li><a href="utilities.html">Utility Functions</a></li>
</ul></li>
<li>Bundling jsPlumb

<ul>
<li><a href="webpack.html">Webpack</a></li>
</ul></li>
<li>Examples

<ul>
<li><a href="connect-examples.html">jsPlumb.connect</a></li>
<li><a href="draggable-connections-examples.html">Draggable Connections</a></li>
<li><a href="miscellaneous-examples.html">Miscellaneous</a></li>
</ul></li>
<li>Development

<ul>
<li><a href="changelog.html">Changelog</a></li>
<li><a href="development.html">Which files are which?</a></li>
<li><a href="Build.html">Building jsPlumb</a></li>
<li><a href="development-documentation.html">Documentation while developing</a></li>
</ul></li>
</ul>


                </div>

            <div id="docs">
                
                <div class="markdown-body">
                    <h2>Scrollable Lists</h2>

<p>jsPlumb supports the concept of scrollable lists - lists of items which can be connected, and when the list is scrolled, any connections
to/from a list item are scrolled too. When a particular list item is scrolled out of the list&#39;s viewport, any connections for that item
are stacked on the list itself.</p>

<ul>
<li><a href="#adding">Adding a List</a></li>
<li><a href="#removing">Removing a List</a></li>
</ul>

<p><a name="adding" ref="list, add, scroll, scrollable" title="Adding a List"></a></p>

<h3>Adding a list</h3>

<p>To add a list you first need to have added it as an element in the DOM, and that it&#39;s behaving list a list does - which probably means its
a <code>ul</code>, a <code>dl</code>, or a <code>div</code> acting as a flex column, with <code>overflow:auto</code>. It is also a requirement that <code>position:relative</code> be set on the list element;
jsPlumb needs this when calculating the offset of its list items.</p>

<p>This is the most basic call:</p>
<div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="nx">jsPlumbInstance</span><span class="p">.</span><span class="nx">addList</span><span class="p">(</span><span class="nx">someElement</span><span class="p">);</span>
</code></pre></div>
<p>jsPlumb will add a <code>jtk-scrollable-list</code> attribute to <code>someElement</code>, and attach a scroll handler to it. If you use the <code>jsplumbtoolkit-defaults.css</code>
 file, this <code>jtk-scrollable-list</code> attribute will cause <code>position:relative</code> to be set on the element. Otherwise just make sure you do it yourself.</p>

<p>With this basic call, when an item scrolls out of the viewport, the behaviour will be:</p>

<ul>
<li><p>if the item scrolls out of the top and the endpoint is a source endpoint, the connection will be anchored to the <code>TopRight</code> of the list, and the
endpoint used will be of the same type as the endpoint on the scrolled item.</p></li>
<li><p>if the item scrolls out of the top and the endpoint is a target endpoint, the connection will be anchored to the <code>TopLeft</code> of the list, and the
endpoint used will be of the same type as the endpoint on the scrolled item.</p></li>
</ul>

<p>Scrolling out of the bottom results in either a <code>BottomRight</code> or <code>BottomLeft</code> anchor being used.</p>

<h4>List options</h4>

<ul>
<li><code>anchor:AnchorSpec</code> Optional. Supply this to provide the anchor used when any item is scrolled out of the viewport. This option takes precedence over <code>deriveAnchor</code>.</li>
<li><code>deriveAnchor:(edge, index, endpoint, connection) =&gt; AnchorSpec</code> Optional; <code>anchor</code> takes precedence. This offers a way for you to dynamically choose an anchor point based on the current situation.
<code>edge</code> is one of <code>&quot;top&quot;</code> or <code>&quot;bottom&quot;</code>. <code>index</code> is 0 for a source endpoint and 1 for a target endpoint.</li>
<li><code>endpoint:EndpointSpec</code> Optional. Supply this to provide the endpoint used when any item is scrolled out of the viewport. <code>deriveEndpoint</code> takes precedence over this.</li>
<li><code>deriveEndpoint:(edge, index, endpoint, connection) =&gt; AnchorSpec</code> Optional. Takes precedence over <code>endpoint</code>. </li>
</ul>

<p><a name="removing" ref="list, remove, scroll, scrollable" title="Removing a list"></a></p>

<h3>Removing a List</h3>
<div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="nx">jsPlumbInstance</span><span class="p">.</span><span class="nx">removeList</span><span class="p">(</span><span class="nx">someElement</span><span class="p">);</span>
</code></pre></div>
                </div>
            </div>
        </div>

        <script>
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
            m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

    ga('create', 'UA-49979015-1', 'auto');
    ga('send', 'pageview');

</script>


    </body>

</html>
